#include "LinkList.h"

//初始化链表
 LinkList* Init_LinkList() {
    LinkList* list = (LinkList*)malloc(sizeof(LinkList));
    list->size = 0;
    //头节点，不保存数据信息
    list->head = (LinkNode*)malloc(sizeof(LinkNode));
    list->head->data = NULL;
    list->head->next = NULL;
     return list;
}
//插入
 void Insert_LinkList(LinkList* list, int pos,void* data) {
    if(list == NULL) return;
    if(data == NULL) return;
    if(pos < 0 || pos > list->size) return;

    //创建新的结点
    LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode));
    newNode->data = data;
    newNode->next = NULL;

    //找结点
    //辅助指针变量
    LinkNode* pCurrent = list->head;
    for(int i = 0; i < pos;i++) {
        pCurrent = pCurrent->next;
    }

    //新节点入链表
    newNode->next = pCurrent->next;
    pCurrent->next = newNode;

    list->size++;

}
//删除指定位置的值
 void RemoveByPos_LinkList(LinkList* list,int pos) {
    if(list == NULL) return;
    if(pos < 0 || pos >= list->size) return;

    //找结点
    //辅助指针变量
    LinkNode* pCurrent = list->head;
    for(int i = 0; i < pos;i++) {
        pCurrent = pCurrent->next;
    }

    //缓存删除的结点
    LinkNode* pDel = pCurrent->next;
    pCurrent->next = pDel->next;
    //释放删除结点的内存
    free(pDel);

    list->size--;
}
//获得链表的长度
 int Size_LinkList(LinkList* list) {
    if(list == NULL)return -1;
    return list->size;
}
//返回第一个结点
 void* Front_LinkList(LinkList* list) {
    if(list == NULL) return NULL;
    return list->head->next->data   ;
}
//释放链表内存
 void FreeSpace_LinkList(LinkList* list) {
    if(list == NULL) return;
    //辅助指针变量
    LinkNode* pCurrent = list->head;

    for(int i = 0;i <= list->size;i++) {
        //缓存下一个结点
        LinkNode* pNext = pCurrent->next;
        free(pCurrent);
        pCurrent = pNext;
    }

    //释放链表内存
    list->size = 0;
    free(list);

}
//查找
 int Find_LinkList(LinkList* list,void* data) {
    if(list == NULL) return -1;
    if(data == NULL) return -1;
    //定义辅助指针
    LinkNode* pCurrent = list->head->next;
    for(int i = 0;i < list->size;i++) {
        if(pCurrent->data == data) {
            return i;
        }
        pCurrent = pCurrent->next;
    }
    return -1;
}
//打印
 void Print_LinkList(LinkList* list,PRINTLINKNODE print) {
    if(list == NULL) return;
    //定义辅助指针变量
    LinkNode* pCurrent = list->head->next;
    for(int i = 0;i < list->size;i++) {
        print(pCurrent->data);
        pCurrent = pCurrent->next;
    }
}